package com.aimusic.utils;

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

/**
 * 高安全性密码加密工具类
 * 特点：
 * 1. 使用 BCrypt 算法（自适应盐值 + 慢哈希）
 * 2. 防彩虹表攻击（内置随机盐值）
 * 3. 防时序攻击（恒定时间比较）
 * 4. 符合 OWASP 密码安全标准
 */
@Component
public class PasswordEncoderUtil {
    
    // BCrypt 强度因子（默认10，值越大越安全但越慢）
    // 生产环境建议 10-12，校园系统用 10 足够
    private static final int BCRYPT_STRENGTH = 10;
    
    private final PasswordEncoder passwordEncoder;
    
    public PasswordEncoderUtil() {
        this.passwordEncoder = new BCryptPasswordEncoder(BCRYPT_STRENGTH);
    }
    
    /**
     * 加密明文密码
     * @param rawPassword 明文密码（如 "123456"）
     * @return BCrypt 加密后的密文（格式：$2a$10$...）
     */
    public String encode(String rawPassword) {
        if (rawPassword == null || rawPassword.isEmpty()) {
            throw new IllegalArgumentException("密码不能为空");
        }

        return passwordEncoder.encode(rawPassword);
    }
    
    /**
     * 验证密码（用于登录）
     * @param rawPassword 用户输入的明文密码
     * @param encodedPassword 数据库存储的密文
     * @return 是否匹配
     */
    public boolean matches(String rawPassword, String encodedPassword) {
        if (rawPassword == null || encodedPassword == null) {
            return false;
        }
        return passwordEncoder.matches(rawPassword, encodedPassword);
    }
    

}